home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / lib / c / crt / sun4.md / RCS / setjmp.s,v < prev    next >
Text File  |  1989-11-22  |  3KB  |  188 lines

  1. head     1.3;
  2. branch   ;
  3. access   ;
  4. symbols  ;
  5. locks    ; strict;
  6. comment  @| @;
  7.  
  8.  
  9. 1.3
  10. date     89.11.22.12.43.30;  author mendel;  state Exp;
  11. branches ;
  12. next     1.2;
  13.  
  14. 1.2
  15. date     89.09.30.10.54.53;  author rab;  state Exp;
  16. branches ;
  17. next     1.1;
  18.  
  19. 1.1
  20. date     89.04.04.13.42.10;  author mgbaker;  state Exp;
  21. branches ;
  22. next     ;
  23.  
  24.  
  25. desc
  26. @Initial sun4 setjmp.
  27. @
  28.  
  29.  
  30. 1.3
  31. log
  32. @Side step bug in window overview that trashes %o1.
  33. @
  34. text
  35. @/* 
  36.  * setjmp.s --
  37.  *
  38.  *    setjmp/longjmp routines for SUN4.
  39.  *
  40.  * Copyright 1988 Regents of the University of California
  41.  * Permission to use, copy, modify, and distribute this
  42.  * software and its documentation for any purpose and without
  43.  * fee is hereby granted, provided that the above copyright
  44.  * notice appear in all copies.  The University of California
  45.  * makes no representations about the suitability of this
  46.  * software for any purpose.  It is provided "as is" without
  47.  * express or implied warranty.
  48.  *
  49.  * static char rcsid[] = "$Header: machCCRegs.s,v 1.1 88/06/15 14:18:30 mendel E
  50. xp $ SPRITE (Berkeley)";
  51.  *
  52.  */
  53.  
  54.  /*
  55.   * Define offsets in the jmp_buf block.
  56.   */
  57.  
  58. #define    SIGMASK_OFFSET    0
  59. #define    RTNPC_OFFSET    4
  60. #define    SP_OFFSET    8
  61. /* 
  62.  *----------------------------------------------------------------------
  63.  *
  64.  * setjmp/_setjmp --
  65.  *
  66.  *    setjmp and _setjmp routines for SUN4.
  67.  *
  68.  * Results:
  69.  *    An integer 0.
  70.  *
  71.  * Side effects:
  72.  *    None.
  73.  *
  74.  * Calling Sequence:
  75.  *    int val = setjmp(env) or val = _setjmp(env)
  76.  *    jmp_buf        env;
  77.  *
  78.  *----------------------------------------------------------------------
  79.  * 
  80.  */
  81.  
  82. .text
  83.     .align 2
  84. .globl _setjmp
  85. .globl    __setjmp
  86. _setjmp:
  87.     save %sp, -104, %sp
  88.     /*
  89.      * First call sigblock(0) to get the current signal mask and 
  90.      * save it in the jmp_env block.
  91.      */
  92.     call     _sigblock,1
  93.     mov    0,%o0
  94.     mov    %o0,%g1
  95.     restore
  96.     st      %g1, [%o0 + SIGMASK_OFFSET]
  97.     /*
  98.      * _setjmp doesn't need the sigmask so it can start here.
  99.      */
  100. __setjmp:
  101.     /*
  102.      * Save our save pointer and return address in the jmp_buf for
  103.      * use by longjmp.
  104.      */
  105.     st      %sp, [%o0 + SP_OFFSET]
  106.     st      %o7, [%o0 + RTNPC_OFFSET]
  107.     /*
  108.      * Return a 0 like a good setjmp should. 
  109.      */
  110.     retl
  111.     mov    0,%o0
  112. /* 
  113.  *----------------------------------------------------------------------
  114.  *
  115.  * longjmp/_longjmp --
  116.  *
  117.  *    longjmp and _longjmp routines for SUN4.
  118.  *
  119.  * Results:
  120.  *    Doesn't return normally.
  121.  *
  122.  * Side effects:
  123.  *    Returns to the specified setjmp/_setjmp call.
  124.  *     longjmp restores the signal mask.
  125.  *
  126.  * Calling Sequence:
  127.  *    longjmp(env,val) or  _setjmp(env,val)
  128.  *    jmp_buf        env;
  129.  *    int    val;
  130.  *
  131.  *----------------------------------------------------------------------
  132.  * 
  133.  */
  134.  
  135.  
  136.  
  137.     .align 2
  138. .globl _longjmp
  139. .globl    __longjmp
  140. _longjmp:
  141.         save    %sp,-96,%sp
  142.     /*
  143.      * Restore the signal mask to the saved value.
  144.      */
  145.     call     _sigsetmask,1
  146.         ld      [%i0+SIGMASK_OFFSET],%o0
  147.     restore
  148.     /*
  149.      * _longjump doesn't restore the sigmask so it can start here.
  150.      */
  151. __longjmp:
  152.     /*
  153.      * Write out the register windows to memory.
  154.      */
  155.     ta    5
  156.     /*
  157.      * Fake togther a call frame that can "return" in to the
  158.      * setjmp call.
  159.      */
  160.     ld    [%o0 + SP_OFFSET], %fp
  161.     sub     %fp, 64, %sp
  162.     ld    [%o0 + RTNPC_OFFSET], %o7
  163.     mov     %o1,%i0
  164.     retl
  165.     restore
  166. @
  167.  
  168.  
  169. 1.2
  170. log
  171. @Add an instruction to set the return value of longjump() to
  172. be the second parameter.
  173. @
  174. text
  175. @d131 1
  176. a131 1
  177.     restore    %o1,0,%o0
  178. @
  179.  
  180.  
  181. 1.1
  182. log
  183. @Initial revision
  184. @
  185. text
  186. @d129 1
  187. @
  188.